home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Internet / gpodder / gpodder-3.8.3-setup.exe / {app} / src / mygpoclient / public.py < prev    next >
Text File  |  2013-02-08  |  7KB  |  212 lines

  1. # -*- coding: utf-8 -*-
  2. # gpodder.net API Client
  3. # Copyright (C) 2009-2013 Thomas Perl and the gPodder Team
  4. #
  5. # This program is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation, either version 3 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  
  18. import mygpoclient
  19.  
  20. from mygpoclient import locator
  21. from mygpoclient import json
  22. from mygpoclient import simple
  23.  
  24. class Tag(object):
  25.     """Container class for a tag in the top tag list
  26.  
  27.     Attributes:
  28.     tag - The name of the tag
  29.     usage - Usage of the tag
  30.     """
  31.  
  32.     REQUIRED_KEYS = ('tag', 'usage')
  33.  
  34.     def __init__(self, tag, usage):
  35.         self.tag = tag
  36.         self.usage = usage
  37.  
  38.     @classmethod
  39.     def from_dict(cls, d):
  40.         for key in cls.REQUIRED_KEYS:
  41.             if key not in d:
  42.                 raise ValueError('Missing keys for tag')
  43.  
  44.         return cls(*(d.get(k) for k in cls.REQUIRED_KEYS))
  45.  
  46.     def __eq__(self, other):
  47.         """Test two tag objects for equality
  48.  
  49.         >>> Tag('u', 123) == Tag('u', 123)
  50.         True
  51.         >>> Tag('u', 123) == Tag('a', 345)
  52.         False
  53.         >>> Tag('u', 123) == 'x'
  54.         False
  55.         """
  56.         if not isinstance(other, self.__class__):
  57.             return False
  58.  
  59.         return all(getattr(self, k) == getattr(other, k) \
  60.                 for k in self.REQUIRED_KEYS)
  61.  
  62.         
  63.  
  64. class Episode(object):
  65.     """Container Class for Episodes
  66.     
  67.     Attributes:
  68.     title -
  69.     url -
  70.     podcast_title -
  71.     podcast_url -
  72.     description -
  73.     website -
  74.     released -
  75.     mygpo_link -
  76.     """
  77.     
  78.     REQUIRED_KEYS = ('title', 'url', 'podcast_title', 'podcast_url',
  79.                      'description', 'website', 'released', 'mygpo_link')
  80.     
  81.     def __init__(self, title, url, podcast_title, podcast_url, description, website, released, mygpo_link):
  82.         self.title = title
  83.         self.url = url
  84.         self.podcast_title = podcast_title
  85.         self.podcast_url = podcast_url
  86.         self.description = description
  87.         self.website = website
  88.         self.released = released
  89.         self.mygpo_link = mygpo_link
  90.         
  91.     @classmethod
  92.     def from_dict(cls, d):
  93.         for key in cls.REQUIRED_KEYS:
  94.             if key not in d:
  95.                 raise ValueError('Missing keys for episode')
  96.             
  97.         return cls(*(d.get(k) for k in cls.REQUIRED_KEYS))
  98.         
  99.     def __eq__(self, other):
  100.         """Test two Episode objects for equality
  101.             
  102.         >>> Episode('a','b','c','d','e','f','g','h') == Episode('a','b','c','d','e','f','g','h')
  103.         True
  104.         >>> Episode('a','b','c','d','e','f','g','h') == Episode('s','t','u','v','w','x','y','z')
  105.         False
  106.         >>> Episode('a','b','c','d','e','f','g','h') == 'x'
  107.         False
  108.         """
  109.         if not isinstance(other, self.__class__):
  110.             return False
  111.  
  112.         return all(getattr(self, k) == getattr(other, k) \
  113.             for k in self.REQUIRED_KEYS)
  114.                 
  115. class PublicClient(object):
  116.     """Client for the gpodder.net "anonymous" API
  117.  
  118.     This is the API client implementation that provides a
  119.     pythonic interface to the parts of the gpodder.net
  120.     Simple API that don't need user authentication.
  121.     """
  122.     FORMAT = 'json'
  123.  
  124.     def __init__(self, host=mygpoclient.HOST, client_class=json.JsonClient):
  125.         """Creates a new Public API client
  126.  
  127.         The parameter host is optional and defaults to
  128.         the main webservice.
  129.  
  130.         The parameter client_class is optional and should
  131.         not need to be changed in normal use cases. If it
  132.         is changed, it should provide the same interface
  133.         as the json.JsonClient class in mygpoclient.
  134.         """
  135.         self._locator = locator.Locator(None, host)
  136.         self._client = client_class(None, None)
  137.  
  138.     def get_toplist(self, count=mygpoclient.TOPLIST_DEFAULT):
  139.         """Get a list of most-subscribed podcasts
  140.  
  141.         Returns a list of simple.Podcast objects.
  142.  
  143.         The parameter "count" is optional and describes
  144.         the amount of podcasts that are returned. The
  145.         default value is 50, the minimum value is 1 and
  146.         the maximum value is 100.
  147.         """
  148.         uri = self._locator.toplist_uri(count, self.FORMAT)
  149.         return [simple.Podcast.from_dict(x) for x in self._client.GET(uri)]
  150.  
  151.     def search_podcasts(self, query):
  152.         """Search for podcasts on the webservice
  153.  
  154.         Returns a list of simple.Podcast objects.
  155.  
  156.         The parameter "query" specifies the search
  157.         query as a string.
  158.         """
  159.         uri = self._locator.search_uri(query, self.FORMAT)
  160.         return [simple.Podcast.from_dict(x) for x in self._client.GET(uri)]
  161.  
  162.     def get_podcasts_of_a_tag(self, tag, count=mygpoclient.TOPLIST_DEFAULT):
  163.         """Get a list of most-subscribed podcasts of a Tag
  164.  
  165.         Returns a list of simple.Podcast objects.
  166.  
  167.         The parameter "tag" specifies the tag as a String
  168.  
  169.         The parameter "count" is optional and describes
  170.         the amount of podcasts that are returned. The
  171.         default value is 50, the minimum value is 1 and
  172.         the maximum value is 100.
  173.         """
  174.         uri = self._locator.podcasts_of_a_tag_uri(tag, count)
  175.         return [simple.Podcast.from_dict(x) for x in self._client.GET(uri)]
  176.  
  177.     def get_toptags(self, count=mygpoclient.TOPLIST_DEFAULT):
  178.         """Get a list of most-used tags
  179.  
  180.         Returns a list of Tag objects.
  181.  
  182.         The parameter "count" is optional and describes
  183.         the amount of podcasts that are returned. The
  184.         default value is 50, the minimum value is 1 and
  185.         the maximum value is 100.
  186.         """
  187.         uri = self._locator.toptags_uri(count)
  188.         return [Tag.from_dict(x) for x in self._client.GET(uri)]
  189.     
  190.     def get_podcast_data(self, podcast_uri):
  191.         """Get Metadata for the specified Podcast
  192.         
  193.         Returns a simple.Podcast object.
  194.         
  195.         The parameter "podcast_uri" specifies the URL of the Podcast.
  196.         """
  197.         uri = self._locator.podcast_data_uri(podcast_uri)
  198.         return simple.Podcast.from_dict(self._client.GET(uri))
  199.     
  200.     def get_episode_data(self, podcast_uri, episode_uri):
  201.         """Get Metadata for the specified Episode
  202.         
  203.         Returns a Episode object.
  204.         
  205.         The parameter "podcast_uri" specifies the URL of the Podcast,
  206.         which this Episode belongs to
  207.         
  208.         The parameter "episode_uri" specifies the URL of the Episode
  209.         """
  210.         uri = self._locator.episode_data_uri(podcast_uri, episode_uri)
  211.         return Episode.from_dict(self._client.GET(uri))
  212.